From 48dc081419d0b483f126ed56edb8b658983052a2 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Thu, 8 May 2014 16:49:58 -0700 Subject: [PATCH] Get nested dependencies working --- Makefile | 2 +- src/cargo/core/package.rs | 5 ++ src/cargo/ops/cargo_rustc.rs | 8 +--- tests/support.rs | 26 ++++++++--- tests/test_cargo_compile.rs | 89 ++++++++++++++++++++++++++++++++++-- 5 files changed, 111 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 683f4ecfd..accb5b87c 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ test-unit: target/tests/test-unit target/tests/test-unit test-integration: target/tests/test-integration - CARGO_BIN_PATH=$(PWD)/target/ $< + RUST_TEST_TASKS=1 CARGO_BIN_PATH=$(PWD)/target/ $< test: test-unit test-integration diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 8b73d359e..456d4902a 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -98,6 +98,7 @@ impl Show for Package { } } +#[deriving(Eq,Clone,Show)] pub struct PackageSet { packages: ~[Package] } @@ -118,6 +119,10 @@ impl PackageSet { names.iter().map(|name| self.get(*name) ).collect() } + pub fn get_packages<'a>(&'a self) -> &'a [Package] { + self.packages.as_slice() + } + // For now, assume that the package set contains only one package with a // given name pub fn sort(&self) -> Option { diff --git a/src/cargo/ops/cargo_rustc.rs b/src/cargo/ops/cargo_rustc.rs index 7f3490836..750f1076b 100644 --- a/src/cargo/ops/cargo_rustc.rs +++ b/src/cargo/ops/cargo_rustc.rs @@ -32,7 +32,7 @@ fn compile_pkg(pkg: &core::Package, pkgs: &core::PackageSet) -> CLIResult<()> { // compile for target in pkg.get_targets().iter() { - try!(rustc(pkg.get_root(), target, &target_dir, deps(pkg, pkgs))); + try!(rustc(pkg.get_root(), target, &target_dir, pkgs.get_packages())) } Ok(()) @@ -74,9 +74,3 @@ fn build_deps_args(dst: &mut Args, deps: &[core::Package]) { dst.push(dir.as_str().unwrap().to_owned()); } } - -// Collect all dependencies for a given package -fn deps(pkg: &core::Package, pkgs: &core::PackageSet) -> ~[core::Package] { - let names: ~[&str] = pkg.get_dependencies().iter().map(|d| d.get_name()).collect(); - pkgs.get_all(names).iter().map(|p| (*p).clone()).collect() -} diff --git a/tests/support.rs b/tests/support.rs index eee1f7e56..72ae985d0 100644 --- a/tests/support.rs +++ b/tests/support.rs @@ -6,6 +6,7 @@ use std::os; use std::path::{Path,BytesContainer}; use std::str; use std::vec::Vec; +use std::fmt::Show; use ham = hamcrest; use cargo::util::{process,ProcessBuilder}; @@ -94,8 +95,6 @@ impl ProjectBuilder { try!(file.mk()); } - println!("{}", self.root.display()); - println!("{:?}", self); Ok(()) } @@ -130,20 +129,20 @@ trait ErrMsg { fn with_err_msg(self, val: ~str) -> Result; } -impl ErrMsg for Result { +impl ErrMsg for Result { fn with_err_msg(self, val: ~str) -> Result { match self { Ok(val) => Ok(val), - Err(_) => Err(val) + Err(err) => Err(format!("{}; original={}", val, err)) } } } // Path to cargo executables pub fn cargo_dir() -> Path { - os::getenv("CARGO_BIN_PATH") - .map(|s| Path::new(s)) - .unwrap_or_else(|| fail!("CARGO_BIN_PATH wasn't set. Cannot continue running test")) + os::getenv("CARGO_BIN_PATH") + .map(|s| Path::new(s)) + .unwrap_or_else(|| fail!("CARGO_BIN_PATH wasn't set. Cannot continue running test")) } /* @@ -221,3 +220,16 @@ pub fn execs() -> Box { expect_exit_code: None } } + +pub trait ResultTest { + fn assert(self) -> T; +} + +impl ResultTest for Result { + fn assert(self) -> T { + match self { + Ok(val) => val, + Err(err) => fail!("Result was error: {}", err) + } + } +} diff --git a/tests/test_cargo_compile.rs b/tests/test_cargo_compile.rs index 8a6596695..93fa0ff0b 100644 --- a/tests/test_cargo_compile.rs +++ b/tests/test_cargo_compile.rs @@ -1,11 +1,10 @@ -use support::{project,execs}; +use support::{ResultTest,project,execs}; use hamcrest::{assert_that,existing_file}; use cargo; fn setup() { } -// Currently doesn't pass due to the code being broken test!(cargo_compile { let p = project("foo") .file("Cargo.toml", r#" @@ -28,8 +27,8 @@ test!(cargo_compile { p.cargo_process("cargo-compile") .args([]) - .exec() - .unwrap(); + .exec_with_output() + .assert(); assert_that(&p.root().join("target/foo"), existing_file()); @@ -38,4 +37,86 @@ test!(cargo_compile { execs().with_stdout("i am foo\n")); }) +test!(cargo_compile_with_nested_deps { + let mut p = project("foo"); + let bar = p.root().join("bar"); + let baz = p.root().join("baz"); + + p = p + .file(".cargo/config", format!(r#" + paths = ["{}", "{}"] + "#, bar.display(), baz.display())) + .file("Cargo.toml", r#" + [project] + + name = "foo" + version = "0.5.0" + authors = ["wycats@example.com"] + + [dependencies] + + bar = "0.5.0" + + [[bin]] + + name = "foo" + "#) + .file("src/foo.rs", r#" + extern crate bar; + + fn main() { + println!("{}", bar::gimme()); + } + "#) + .file("bar/Cargo.toml", r#" + [project] + + name = "bar" + version = "0.5.0" + authors = ["wycats@example.com"] + + [dependencies] + + baz = "0.5.0" + + [[lib]] + + name = "bar" + "#) + .file("bar/src/bar.rs", r#" + extern crate baz; + + pub fn gimme() -> ~str { + baz::gimme() + } + "#) + .file("baz/Cargo.toml", r#" + [project] + + name = "baz" + version = "0.5.0" + authors = ["wycats@example.com"] + + [[lib]] + + name = "baz" + "#) + .file("baz/src/baz.rs", r#" + pub fn gimme() -> ~str { + "test passed".to_owned() + } + "#) + .build(); + + p.cargo_process("cargo-compile") + .exec_with_output() + .assert(); + + assert_that(&p.root().join("target/foo"), existing_file()); + + assert_that( + cargo::util::process("foo").extra_path(p.root().join("target")), + execs().with_stdout("test passed\n")); +}) + // test!(compiling_project_with_invalid_manifest) -- 2.30.2